package intent.demo;

import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class IntentActivity extends Activity {
	
	Button btnExplicitStartActivity = null;
	Button btnImplicitStartActivity = null;
	Button btnFromActivityPassAndReturnValue = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        btnExplicitStartActivity = (Button)this.findViewById(R.id.btnExplicitStartActivity);
        btnImplicitStartActivity = (Button)this.findViewById(R.id.btnImplicitStartActivity);
        btnFromActivityPassAndReturnValue = (Button)this.findViewById(R.id.btnFromActivityPassAndReturnValue);
        
        /**显式启动Activity*/
        
        btnExplicitStartActivity.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				Intent intent = new Intent(IntentActivity.this, SecondActivity.class);
				startActivity(intent);
			}
		});
        

        /**
         * 隐式启动Activity
         * 
         * 隐式Intent是一种让匿名应用程序组件服务动作请求的机制。当创建一个新的隐式Intent时，你指定要执行的动作，
         * 作为可选项，你可以提供这个动作所需的数据。当你使用这个新的隐式Intent来启动Activity时，Android会在运行
         * 时解析它，找到最适合在指定的数据类型上执行动作的类。这意味着，你可以创建使用其它应用程序的工程，而不
         * 需要提前精确地知道你会借用哪个应用程序的功能。
         * 
         * 下面Android解析这个Intent并启动一个提供了能在一个号码上执行拨号动作的Activity，在这里，是拨号Activity。
         */
        
        btnImplicitStartActivity.setOnClickListener(new View.OnClickListener() {
			
			public void onClick(View v) {
				//Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:555-2368"));
				//Uri uri = Uri.parse("http://www.google.com:80/search/products/?q=android");
				Uri uri = Uri.parse("mailto:depl_hot@163.com");
				//Uri uri = Uri.parse("tel:12234322");
				Log.v("Uri", "Scheme : " + uri.getScheme());
				Log.v("Uri", "Scheme Specific Part : " + uri.getSchemeSpecificPart());
				
				Log.v("Uri", "Path : " + uri.getPath());
				List<String> pathSegments = uri.getPathSegments();
				
				for (String item : pathSegments) {
					Log.v("Uri", "Path Segments : " + item);
				}

				Log.v("Uri", "Host : " + uri.getHost());
				Log.v("Uri", "Port : " + uri.getPort());
				Log.v("Uri", "Authority : " + uri.getAuthority());
				Log.v("Uri", "Last Path Segment : " + uri.getLastPathSegment());
				Log.v("Uri", "Query : " + uri.getQuery());
				Log.v("Uri", "Path Segments : " + uri.getPathSegments());
				
				Intent intent = new Intent("intent.demo.RIIA", uri);
				startActivity(intent);
			}
		});
        
        /**
         * Activity返回值
         * startActivityForResult方法和startActivity方法工作很相似，但有一个很重要的差异。Intent都是用来决定启动哪个Activity，
         * 你还可以传入一个请求码。这个值将在后面用来作为有返回值Activity的唯一ID(SHOW_SECONDACTIVITY)。
         * 
         * 当子Activity准备关闭时，在finish之前调用setResult来给调用的Activity返回一个结果。
         * 当子Activity关闭时，它的父Activity的onActivityResult事件处理函数被触发。
         * */
        
        btnFromActivityPassAndReturnValue.setOnClickListener(new View.OnClickListener() {
        	private static final int SHOW_SECONDACTIVITY = 1;
        	
			public void onClick(View v) {
				Intent intent = new Intent(IntentActivity.this, SecondActivity.class);
				intent.putExtra("WHO_IS_MY_LOVE", "who is my love?");
				startActivityForResult(intent, SHOW_SECONDACTIVITY);
			}
		});
    }

    /**
     * 当子Activity关闭时，它的父Activity的onActivityResult事件处理函数被触发。
     * 
     *	requestCode (请求码): 	曾经用来启动子Activity的请求码。
     *  
     *	resultCode (结果码): 	结果码是由子Activity设置的，用来显示它的结果。它可以是任何整数值，但典型的值是Activity.RESULT_OK和
     *				Activity.RESULT_CANCELLED。如果子Activity非正常关闭或在关闭时没有指定结果码，结果码都是Activity.RESULT_CANCELED。
     *
 	 *	data (数据): 	一个Intent来打包任何返回的数据。依赖于子Activity的目的，它可能会包含一个代表特殊的从列表中选择的数据的URI。
 	 *				可变通的，或额外的，子Activity可以使用“extras”机制以基础值的方式返回临时信息。
 	 *
     */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		String returnResult = data.getStringExtra("RETURN_RESULT");
		
		Log.v("Return Value", returnResult);
	}
    
}